﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.Reporting.WebForms;
using Negocio.catalogos;
using Negocio;
using MessagingToolkit.QRCode.Codec;
using MessagingToolkit.QRCode.Codec.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

namespace Presentacion.controlasistencia
{
    public partial class ReporteMensual : System.Web.UI.Page
    {

        catalogoPeriodo _objCatalogoPeriodo = new catalogoPeriodo();
        catalogoCabecera _objCatalogoCabecera = new catalogoCabecera();
        catalogoHorario _objHorarioClases = new catalogoHorario();
        encriptaje _objEncriptaje = new encriptaje();
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Request.QueryString["cod"] != null && Session["periodo"] != null)
            {
                int codigoDistribucion = int.Parse(_objEncriptaje.decodeControlAsistencia(Request.QueryString["cod"].ToString()));

                int idPeriodoActual = int.Parse(Session["periodo"].ToString());
                if (!IsPostBack)
                {
                    ddlPeriodo.Items.Clear();
                    ddlPeriodo.Items.Add(new ListItem("Seleccione periodo.", ""));
                    foreach (var item in _objCatalogoPeriodo.obtenerPeriodoxTOP())
                    {
                        ddlPeriodo.Items.Add(new ListItem(item.nombre, item.idPeriodo.ToString()));
                    }
                    var resultDistribucion = new catalogoDistribucion().obtenerDistribucionId(codigoDistribucion).First();
                    lblCarrera.Text = resultDistribucion.Nombre;
                }

            }
            else
            {
                Response.Redirect("Default.aspx");
            }
        }

        protected void btnReporteMensual_Click(object sender, EventArgs e)
        {
            try
            {

                if (Session["periodo"] != null)
                {
                    var postE = Request.Form["ddlReporteMeses"];
                    string[] valores = postE.Split(new Char[] { '-' });
                    int mes =Convert.ToInt32(valores[0]);
                    int anio =Convert.ToInt32(valores[1]);
                    QRCodeEncoder encoder = new QRCodeEncoder();
                    Bitmap codigo = null;
                    if (ddlPeriodo.SelectedItem.Value != "" && mes>0 && postE != "" && postE != null)
                    {

                        int idPeriodoActual = int.Parse(ddlPeriodo.SelectedItem.Value.ToString());
                        //int mes = int.Parse(postE);
                        
                        var inicioDeClases = new catalogoCalendarioAcademico().obtenerInicioANDFinDeClases(idPeriodoActual, "#00a65a");
                        var finDeClases = new catalogoCalendarioAcademico().obtenerInicioANDFinDeClases(idPeriodoActual, "#0073b7");
                        DateTime fechacomparacion = new DateTime(DateTime.Now.Year, mes, 1);
                        if (inicioDeClases != null && finDeClases != null)
                        {
                            //if (inicioDeClases.start.Value.Month >= fechacomparacion.Month && ((finDeClases.start.Value.Month <= fechacomparacion.Month) || (finDeClases.start.Value.Month >= fechacomparacion.Month) || (finDeClases.start.Value.Year <= fechacomparacion.Year))) //inicioDeClases.start.Value.Month >= mes && finDeClases.start.Value.Month <= mes
                            //{

                                int codigoDistribucion = int.Parse(_objEncriptaje.decodeControlAsistencia(Request.QueryString["cod"].ToString()));
                                var resultDistribucion = new catalogoDistribucion().obtenerDistribucionId(codigoDistribucion).First();
                                var resultDistribucionPeriodo = new catalogoDistribucion().obtenerDistribucionXIdPeriodoXNombre(idPeriodoActual, resultDistribucion.Nombre, resultDistribucion.idCarrera);
                                if (resultDistribucionPeriodo.Count() != 0)
                                {
                                    codigoDistribucion = resultDistribucionPeriodo.First().idDistribucion;
                                }

                                var resultOpciones = new catalogoOpciones().obtenerNroSemanas(idPeriodoActual);
                                DateTime dia = DateTime.Now; //Obtiene dia actual
                                int totalHoraAcumuladas = 0;

                            //int totalMesActual = _objCatalogoCabecera.obtenerHorasTrabajadasMesActual(codigoDistribucion, idPeriodoActual, new DateTime(dia.Year, mes, dia.Day));
                            int totalMesActual = _objCatalogoCabecera.obtenerHorasTrabajadasMesActual(codigoDistribucion, idPeriodoActual, new DateTime(anio, mes, dia.Day));
                            var periodo = new catalogoPeriodo().obtenerPeriodo(idPeriodoActual).First();


                                #region Datos Horario

                                string[] diasSemana = new string[] { "LU", "MA", "MI", "JU", "VI" };
                                //Buscar inicio de semana
                                //Inicio busqueda inicio de semana
                                while (dia.DayOfWeek != DayOfWeek.Monday)
                                {
                                    if (dia.DayOfWeek == DayOfWeek.Sunday)
                                    {
                                        dia = dia.AddDays(1);
                                    }
                                    else
                                    {
                                        dia = dia.AddDays(-1);
                                    }
                                }

                                //Carga del horario para validacion
                                var consultaHorario = _objHorarioClases.obtenerHorarioXidPeriodoANDidDistribucion(idPeriodoActual, codigoDistribucion);
                                int totalSemanal = 0;
                                if (consultaHorario.Count() > 0)
                                {
                                    //Bucle por cada de la semana
                                    totalSemanal = 0;
                                    for (int i = 0; i < 5; i++)
                                    {
                                        int nroHoraDistribucion = 0;

                                        var resultFiltroHorario = consultaHorario.Where(E => E.detalle == dia.DayOfWeek.ToString()).ToList();
                                        if (resultFiltroHorario.Count > 0)
                                        {

                                            foreach (var item in resultFiltroHorario)
                                            {
                                                TimeSpan _intervaloHoraEntrada = TimeSpan.Parse(item.horaEntrada);
                                                TimeSpan _intervaloHoraSalida = TimeSpan.Parse(item.horaSalida);

                                            //    DateTime dia1 = new DateTime(dia.Year, dia.Month, dia.Day, _intervaloHoraEntrada.Hours, _intervaloHoraEntrada.Minutes, 0); //Hora Inicio 
                                            //  DateTime dia2 = new DateTime(dia.Year, dia.Month, dia.Day, _intervaloHoraSalida.Hours, _intervaloHoraSalida.Minutes, 0);  //hora Fin
                                             DateTime dia1 = new DateTime(anio, dia.Month, dia.Day, _intervaloHoraEntrada.Hours, _intervaloHoraEntrada.Minutes, 0); //Hora Inicio 
                                             DateTime dia2 = new DateTime(anio, dia.Month, dia.Day, _intervaloHoraSalida.Hours, _intervaloHoraSalida.Minutes, 0);  //hora Fin

                                            nroHoraDistribucion = (dia2.Subtract(dia1)).Hours;
                                                totalSemanal = totalSemanal + nroHoraDistribucion;
                                                //fin busqueda dia de la semana                   

                                            }
                                        }
                                        dia = dia.AddDays(1);

                                    }
                                }
                                else
                                {
                                    totalSemanal = 0;
                                }
                                #endregion

                                if (resultOpciones != null)
                                {
                                    totalHoraAcumuladas = resultOpciones.nroSemanas * totalSemanal;
                                }
                                else
                                {
                                    totalHoraAcumuladas = 0;
                                }
                            //int totalMesesAnterior = _objCatalogoCabecera.obtenerHorasTrabajadasMesActual(codigoDistribucion, idPeriodoActual, new DateTime(dia.Year, mes - 1, dia.Day));
                            int totalMesesAnterior = 0;
                            if (mes==1)
                            {
                                totalMesesAnterior = _objCatalogoCabecera.obtenerHorasTrabajadasMesActual(codigoDistribucion, idPeriodoActual, new DateTime(anio-1, 12, dia.Day));
                            }
                            else
                            {
                                 totalMesesAnterior = _objCatalogoCabecera.obtenerHorasTrabajadasMesActual(codigoDistribucion, idPeriodoActual, new DateTime(anio, mes - 1, dia.Day));
                            }
                            


                            string mesTexto = "";
                                switch (mes)
                                {
                                    case 1:
                                        mesTexto = "ENERO";
                                        break;
                                    case 2:
                                        mesTexto = "FEBRERO";
                                        break;
                                    case 3:
                                        mesTexto = "MARZO";
                                        break;
                                    case 4:
                                        mesTexto = "ABRIL";
                                        break;
                                    case 5:
                                        mesTexto = "MAYO";
                                        break;
                                    case 6:
                                        mesTexto = "JUNIO";
                                        break;
                                    case 7:
                                        mesTexto = "JULIO";
                                        break;
                                    case 8:
                                        mesTexto = "AGOSTO";
                                        break;
                                    case 9:
                                        mesTexto = "SEPTIEMBRE";
                                        break;
                                    case 10:
                                        mesTexto = "OCTUBRE";
                                        break;
                                    case 11:
                                        mesTexto = "NOVIEMBRE";
                                        break;
                                    case 12:
                                        mesTexto = "DICIEMBRE";
                                        break;
                                    default:
                                        break;
                                }

                                var resultCAbeceralista = _objCatalogoCabecera.obtenerCabeceraXIdDistribucionANDidPeridoFiltradoColumnas(codigoDistribucion, idPeriodoActual);
                                var resultCabecera = from filtro in resultCAbeceralista
                                                     where filtro.fechaCabecera.Month == mes
                                                     select filtro;
                                var resultCabeceraNormal = _objCatalogoCabecera.obtenerCabeceraXIdDistribucionANDidPerido(codigoDistribucion, idPeriodoActual);
                                ReportParameter[] reportParameter = new ReportParameter[(resultCabecera.Count() * 4) + 31];
                                int contador = 0, iT = 1;
                                if (resultCabecera.Count() > 0)
                                {

                                    if (resultCabecera.Count() > 12)
                                    {
                                        ReportViewer1.Visible = false;
                                        ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "errorMessage('informe desbordado, contactese con el administrador.');", true);
                                    }
                                    else
                                    {

                                        foreach (var item in resultCabecera)
                                        {
                                            reportParameter[contador] = new ReportParameter("dia" + iT, item.fechaCabecera.Day.ToString());
                                            contador++;
                                            reportParameter[contador] = new ReportParameter("asi" + iT, item.observacion);
                                            contador++;
                                            reportParameter[contador] = new ReportParameter("mes" + iT, item.fechaCabecera.Month.ToString());
                                            contador++;
                                            int totalHoras = 0;
                                            foreach (var itemHoras in resultCabeceraNormal.Where(R => R.fechaCabecera.Date == item.fechaCabecera))
                                            {
                                                TimeSpan _intervaloHoraEntrada = TimeSpan.Parse(item.idDetalleHorario.horaEntrada);
                                                TimeSpan _intervaloHoraSalida = TimeSpan.Parse(item.idDetalleHorario.horaSalida);

                                                DateTime diaHora = DateTime.Now; //Obtiene dia actual
                                                                                 //DateTime dia1 = new DateTime(dia.Year, dia.Month, dia.Day, _intervaloHoraEntrada.Hours, _intervaloHoraEntrada.Minutes, 0); //Hora Inicio 
                                                                                 //DateTime dia2 = new DateTime(dia.Year, dia.Month, dia.Day, _intervaloHoraSalida.Hours, _intervaloHoraSalida.Minutes, 0);  //hora Fin
                                            DateTime dia1 = new DateTime(anio, dia.Month, dia.Day, _intervaloHoraEntrada.Hours, _intervaloHoraEntrada.Minutes, 0); //Hora Inicio 
                                            DateTime dia2 = new DateTime(anio, dia.Month, dia.Day, _intervaloHoraSalida.Hours, _intervaloHoraSalida.Minutes, 0);  //hora Fin

                                            int horaClaseColumna = (dia2.Subtract(dia1)).Hours;
                                                totalHoras = totalHoras + horaClaseColumna;
                                            }


                                            reportParameter[contador] = new ReportParameter("hora" + iT, totalHoras.ToString());
                                            contador++;
                                            iT++;
                                        }

                                        reportParameter[contador] = new ReportParameter("mesActual", mesTexto);
                                        contador++;

                                        var resultDocente = new catalogoDocente().consultarDocenteXId(resultDistribucion.idDocente);
                                        if (resultDocente != null)
                                        {
                                            reportParameter[contador] = new ReportParameter("docente", resultDocente.nombre + " " + resultDocente.apellido1 + " " + resultDocente.apellido2);
                                        codigo = encoder.Encode(resultDocente.nombre + " " + resultDocente.apellido1 + " " + resultDocente.apellido2 + "|" + resultDocente.documento + "|" + resultDocente.idDocente + "|" + DateTime.Now.ToShortDateString());
                                        contador++;
                                        }
                                        else
                                        {
                                            reportParameter[contador] = new ReportParameter("docente", Session["nombresDocente"].ToString() + " " + Session["apellido"].ToString());
                                            contador++;
                                        }

                                        reportParameter[contador] = new ReportParameter("cursoMateria", resultDistribucion.Nombre);
                                        contador++;
                                        reportParameter[contador] = new ReportParameter("semestre", resultDistribucion.semestre.ToString());
                                        contador++;
                                        reportParameter[contador] = new ReportParameter("paralelo", resultDistribucion.paralelo);
                                        contador++;
                                        reportParameter[contador] = new ReportParameter("totalAcumuladorSemestre", totalHoraAcumuladas.ToString());
                                        contador++;
                                        reportParameter[contador] = new ReportParameter("totalMesAnterior", totalMesesAnterior.ToString());
                                        contador++;
                                        reportParameter[contador] = new ReportParameter("totalAsistenciaMes", totalMesActual.ToString());
                                        contador++;
                                        var horasJustificada = new catalogoBitacora().obtenerBitocaraXidDistribucionANDXTipo(codigoDistribucion, idPeriodoActual, 2).Sum(E => E.nroHoras);
                                        var horasINJustificada = new catalogoBitacora().obtenerBitocaraXidDistribucionANDXTipo(codigoDistribucion, idPeriodoActual, 2).Sum(E => E.nroHoras);

                                        reportParameter[contador] = new ReportParameter("totalHorasNoTrabajadas", (horasINJustificada + horasJustificada).ToString());
                                        contador++;
                                        reportParameter[contador] = new ReportParameter("totalHorasXSemanas", totalSemanal.ToString());
                                        contador++;
                                        reportParameter[contador] = new ReportParameter("carrera", resultDistribucion.carrera);
                                        contador++;
                                        reportParameter[contador] = new ReportParameter("periodo", periodo.nombre);
                                        contador++;

                                        reportParameter[contador] = new ReportParameter("observaciones", new catalogoReporte().reporteObservaciones(idPeriodoActual, new DateTime(anio, mes, dia.Day)));
                                        contador++;

                                        var carrera = new catalogoCarrera().obtenerTodasCarreras().Where(W => W.carrera == resultDistribucion.carrera).FirstOrDefault();
                                        if (carrera != null)
                                        {
                                            var _coordinador = new catalogoUsuario().consultarCoordinador((int)resultDistribucion.semestre, carrera.idCarrera);
                                            if (_coordinador != null)
                                            {
                                                var resultCoordinador = new catalogoDocente().consultarDocenteXId(_coordinador.idDocente);
                                                if (resultCoordinador != null)
                                                {
                                                    reportParameter[contador] = new ReportParameter("coordinador", resultCoordinador.nombre + " " + resultCoordinador.apellido1 + " " + resultCoordinador.apellido2);
                                                    contador++;
                                                }
                                                else
                                                {
                                                    reportParameter[contador] = new ReportParameter("coordinador", "");
                                                    contador++;
                                                }
                                            }
                                            else
                                            {
                                                reportParameter[contador] = new ReportParameter("coordinador", "");
                                                contador++;
                                            }

                                        }
                                        else
                                        {
                                            reportParameter[contador] = new ReportParameter("coordinador", "");
                                            contador++;
                                        }
                                        var resultHorario = new catalogoReporte().obtenerHorario(idPeriodoActual, codigoDistribucion);
                                        iT = 1;
                                        foreach (var item in resultHorario)
                                        {
                                            reportParameter[contador] = new ReportParameter("ent" + iT, item.horaInicio);
                                            contador++;
                                            reportParameter[contador] = new ReportParameter("sal" + iT, item.horaFin);
                                            contador++;
                                            reportParameter[contador] = new ReportParameter("hor" + iT, item.horaClase);
                                            contador++;
                                            iT++;
                                        }
                                    reportParameter[contador] = new ReportParameter("ReportLogo", ConvertImageToBase64(codigo, ImageFormat.Png));
                                    contador++;
                                    reportParameter[contador] = new ReportParameter("ReportLogoMIMEtype", "image/png");
                                    contador++;
                                    codigo.Dispose();
                                    ReportViewer1.LocalReport.DataSources.Clear();

                                        ReportDataSource dataSourceAsistencia = new ReportDataSource();

                                        dataSourceAsistencia.Name = "dtsAsistenciaMensual";
                                        dataSourceAsistencia.Value = new catalogoReporte().obternerAsistenciaMensual(idPeriodoActual, codigoDistribucion, mes,anio);

                                        ReportViewer1.LocalReport.DataSources.Add(dataSourceAsistencia);

                                        ReportViewer1.LocalReport.ReportEmbeddedResource = "Presentacion.controlasistencia.reports.reporteMensual.rdlc";
                                        ReportViewer1.LocalReport.ReportPath = "controlasistencia/reports/reporteMensual.rdlc";

                                        ReportViewer1.LocalReport.SetParameters(reportParameter);
                                        var parame = ReportViewer1.LocalReport.GetParameters();
                                        ReportViewer1.Visible = true;
                                        ReportViewer1.DataBind();
                                        ReportViewer1.LocalReport.Refresh();
                                    }
                                    ddlPeriodo.ClearSelection();
                                }
                                else
                                {
                                    ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "errorMessage('No existen datos para este reporte.');", true);
                                    ddlPeriodo.ClearSelection();
                                }
                            //}
                            //else
                            //{
                            //    ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "errorMessage('Seleccione un mes dentro del periodo de clases.');", true);
                            //    ddlPeriodo.ClearSelection();
                            //}
                        }
                        else
                        {
                            ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "errorMessage('Error contactase con el administrador.');", true);
                            ddlPeriodo.ClearSelection();
                        }
                    }
                    else
                    {
                        ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "errorMessage('Seleccione los parametros de busqueda');", true);
                        ddlPeriodo.ClearSelection();
                        ReportViewer1.Visible = false;
                    }
                }
                else
                {
                    Server.Transfer("Default.aspx");
                }
            }
            catch (Exception)
            {
                ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "errorMessage('Error en el servidor intentelo de nuevo');", true);
                ReportViewer1.Visible = false;
            }

        }
        public System.Drawing.Image Bytes_A_Imagen(Byte[] ImgBytes)
        {
            Bitmap imagen = null;
            Byte[] bytes = (Byte[])(ImgBytes);
            MemoryStream ms = new MemoryStream(bytes);
            imagen = new Bitmap(ms);
            return imagen;
        }

        #region REPORTE GENERAL
        #region meses 
        public string  meses(int idP)
        {
            System.Text.StringBuilder html = new System.Text.StringBuilder();
            try
            {
                Negocio.catalogos.catalogoPeriodo _obj = new Negocio.catalogos.catalogoPeriodo();
                var inicioDeClases = new catalogoCalendarioAcademico().obtenerInicioANDFinDeClases(Convert.ToInt32(idP), "#00a65a");
                var finDeClases = new catalogoCalendarioAcademico().obtenerInicioANDFinDeClases(Convert.ToInt32(idP), "#0073b7");
                int diferencia = (finDeClases.start.Value.Month - inicioDeClases.start.Value.Month) + 12 * (finDeClases.start.Value.Year - inicioDeClases.start.Value.Year);
                var resultado = _obj.obtenerPeriodo(Convert.ToInt32(idP));
                if (diferencia > 0) //resultado.Count() > 0
                {
                   
                    var fechaInicio = new catalogoCalendarioAcademico().obtenerInicioANDFinDeClases(Convert.ToInt32(idP), "#00a65a");
                    var fechaFin = new catalogoCalendarioAcademico().obtenerInicioANDFinDeClases(Convert.ToInt32(idP), "#0073b7");
                    
                    int meses = (fechaFin.start.Value.Month - fechaInicio.start.Value.Month) + 12 * (fechaFin.start.Value.Year - fechaInicio.start.Value.Year);
                    int numeroMes = 0;
                    string nombreMes = "";
                    for (int i = 0; i <= meses; i++)
                    {

                       
                        int filtro = fechaInicio.start.Value.Month + i;
                        int anio = fechaInicio.start.Value.Year;
                        if (filtro > 12)
                        {
                            filtro = filtro - 12;
                          
                            anio = fechaFin.start.Value.Year;
                        }
                        switch (filtro)
                        {
                            case 1: numeroMes = 1; nombreMes = "Enero"; break;
                            case 2: numeroMes = 2; nombreMes = "Febrero"; break;
                            case 3: numeroMes = 3; nombreMes = "Marzo"; break;
                            case 4: numeroMes = 4; nombreMes = "Abril"; break;
                            case 5: numeroMes = 5; nombreMes = "Mayo"; break;
                            case 6: numeroMes = 6; nombreMes = "Junio"; break;
                            case 7: numeroMes = 7; nombreMes = "Julio"; break;
                            case 8: numeroMes = 8; nombreMes = "Agosto"; break;
                            case 9: numeroMes = 9; nombreMes = "Septiembre"; break;
                            case 10: numeroMes = 10; nombreMes = "Octubre"; break;
                            case 11: numeroMes = 11; nombreMes = "Noviembre"; break;
                            case 12: numeroMes = 12; nombreMes = "Diciembre"; break;
                            default: break;
                        }
                        html.Clear();
                        html.Append(numeroMes+ " - " + anio);
                    }
                    //}
                }
            }
            catch (Exception)
            {
                html.Append("0-0");
            }
            return html.ToString();
        }
        #endregion

        protected void btnReporteGeneral_Click(object sender, EventArgs e)
        {
       

            try
            {
                if (Session["periodo"] != null)
                {
                    if (ddlPeriodo.SelectedItem.Value != "")
                    {

                        QRCodeEncoder encoder = new QRCodeEncoder();
                        Bitmap codigo=null;
                        //Bytes_A_Imagen(codigo);
                        //String path = Server.MapPath("~/controlasistencia/temporal/codigo.png");

                        var postE = Request.Form["ddlReporteMeses"];
                        //string[] valores = postE.Split(new Char[] { '-' });
                        string[] valores = meses(Convert.ToInt32(ddlPeriodo.SelectedItem.Value)).Split(new Char[] { '-' });
                        int mes = Convert.ToInt32(valores[0]);
                        int anio = Convert.ToInt32(valores[1]);
                        DateTime dia = DateTime.Now; //Obtiene dia actual
                        int codigoDistribucion = int.Parse(_objEncriptaje.decodeControlAsistencia(Request.QueryString["cod"].ToString()));
                        int idPeriodoActual = Convert.ToInt32(ddlPeriodo.SelectedValue);
                        var resultDistribucion = new catalogoDistribucion().obtenerDistribucionId(codigoDistribucion).First();
                        var resultDistribucionPeriodo = new catalogoDistribucion().obtenerDistribucionXIdPeriodoXNombre(idPeriodoActual, resultDistribucion.Nombre,resultDistribucion.idCarrera );
                        if (resultDistribucionPeriodo.Count() != 0)
                        {
                            codigoDistribucion = resultDistribucionPeriodo.First().idDistribucion;

                        }
                        int totalHoraAcumuladas = _objCatalogoCabecera.obtenerHorasTrabajadasAcumuladas(codigoDistribucion, idPeriodoActual);
                        int total16hora = 0;
                        var periodo = new catalogoPeriodo().obtenerPeriodo(idPeriodoActual).First();


                        #region Datos Horario
                        string[] diasSemana = new string[] { "LU", "MA", "MI", "JU", "VI" };
                        //Buscar inicio de semana
                        //Inicio busqueda inicio de semana
                        while (dia.DayOfWeek != DayOfWeek.Monday)
                        {
                            if (dia.DayOfWeek == DayOfWeek.Sunday)
                            {
                                dia = dia.AddDays(1);
                            }
                            else
                            {
                                dia = dia.AddDays(-1);
                            }
                        }

                        //Carga del horario para validacion
                        var consultaHorario = _objHorarioClases.obtenerHorarioXidPeriodoANDidDistribucion(idPeriodoActual, codigoDistribucion);
                        int totalSemanal = 0;
                        if (consultaHorario.Count() > 0)
                        {
                            //Bucle por cada de la semana
                            totalSemanal = 0;
                            for (int i = 0; i < 5; i++)
                            {

                                int nroHoraDistribucion = 0;

                                var resultFiltroHorario = consultaHorario.Where(E => E.detalle == dia.DayOfWeek.ToString()).ToList();
                                if (resultFiltroHorario.Count > 0)
                                {

                                    foreach (var item in resultFiltroHorario)
                                    {
                                        TimeSpan _intervaloHoraEntrada = TimeSpan.Parse(item.horaEntrada);
                                        TimeSpan _intervaloHoraSalida = TimeSpan.Parse(item.horaSalida);

                                        //DateTime dia1 = new DateTime(dia.Year, dia.Month, dia.Day, _intervaloHoraEntrada.Hours, _intervaloHoraEntrada.Minutes, 0); //Hora Inicio 
                                        //DateTime dia2 = new DateTime(dia.Year, dia.Month, dia.Day, _intervaloHoraSalida.Hours, _intervaloHoraSalida.Minutes, 0);  //hora Fin
                                        DateTime dia1 = new DateTime(anio, dia.Month, dia.Day, _intervaloHoraEntrada.Hours, _intervaloHoraEntrada.Minutes, 0); //Hora Inicio 
                                        DateTime dia2 = new DateTime(anio, dia.Month, dia.Day, _intervaloHoraSalida.Hours, _intervaloHoraSalida.Minutes, 0);  //hora Fin

                                        nroHoraDistribucion = (dia2.Subtract(dia1)).Hours;
                                        totalSemanal = totalSemanal + nroHoraDistribucion;
                                        //fin busqueda dia de la semana                   

                                    }
                                }

                                dia = dia.AddDays(1);

                            }
                        }
                        else
                        {
                            totalSemanal = 0;
                        }
                        #endregion
                        var resultOpciones = new catalogoOpciones().obtenerNroSemanas(idPeriodoActual);

                        if (resultOpciones != null)
                        {
                            total16hora = resultOpciones.nroSemanas * totalSemanal;
                        }
                        else
                        {
                            total16hora = 0;
                        }
                        var resultCabecera = new catalogoCabecera().obtenerCabeceraXIdDistribucionANDidPeridoFiltradoColumnas(codigoDistribucion, idPeriodoActual);
                        var estudiantesDistribucion = new catalogoEstudiante().obtenerEstudiante(codigoDistribucion);
                        var listaPromedioAsistencia = new Dictionary<string, int>();
                        ReportParameter[] reportParameter = new ReportParameter[33];
                        int contador = 0, iT = 0;
                        if (resultCabecera.Count() > 0)
                        {


                            int contadorAcreditado = 0, contadorNoAcreditado = 0;

                            var resulReporteGeneral = new catalogoReporte().obtenerAsistenciaGeneral(idPeriodoActual, codigoDistribucion);

                            contadorNoAcreditado = (from item in resulReporteGeneral
                                                    where item.asistenciaAcumuladaPorcentaje < 85
                                                    select item).Count();

                            contadorAcreditado = estudiantesDistribucion.Count - contadorNoAcreditado;

                            var resultDocente = new catalogoDocente().consultarDocenteXId(resultDistribucion.idDocente);
                            if (resultDocente != null)
                            {
                                reportParameter[contador] = new ReportParameter("docente", resultDocente.nombre + " " + resultDocente.apellido1 + " " + resultDocente.apellido2);
                                codigo = encoder.Encode(resultDocente.nombre+" "+resultDocente.apellido1+" "+resultDocente.apellido2+"|"+resultDocente.documento+"|"+resultDocente.idDocente+"|"+DateTime.Now.ToShortDateString());
                                contador++;
                            }
                            else
                            {
                                reportParameter[contador] = new ReportParameter("docente", Session["nombresDocente"].ToString() + " " + Session["apellido"].ToString());
                                contador++;
                            }

                            reportParameter[contador] = new ReportParameter("cursoMateria", resultDistribucion.Nombre);
                            contador++;
                            reportParameter[contador] = new ReportParameter("semestre", resultDistribucion.semestre.ToString());
                            contador++;
                            reportParameter[contador] = new ReportParameter("paralelo", resultDistribucion.paralelo);
                            contador++;
                            reportParameter[contador] = new ReportParameter("horatrabajadas", totalHoraAcumuladas.ToString());
                            contador++;
                            reportParameter[contador] = new ReportParameter("totalHora16", total16hora.ToString());
                            contador++;
                            var horasJustificada = new catalogoBitacora().obtenerBitocaraXidDistribucionANDXTipo(codigoDistribucion, idPeriodoActual, 2).Sum(E => E.nroHoras);
                            var horasINJustificada = new catalogoBitacora().obtenerBitocaraXidDistribucionANDXTipo(codigoDistribucion, idPeriodoActual, 2).Sum(E => E.nroHoras);
                            reportParameter[contador] = new ReportParameter("horaNoTrabajadas", (horasJustificada + horasINJustificada).ToString());
                            contador++;
                            reportParameter[contador] = new ReportParameter("carrera", resultDistribucion.carrera);
                            contador++;
                            reportParameter[contador] = new ReportParameter("periodo", periodo.nombre);
                            contador++;
                            reportParameter[contador] = new ReportParameter("totalEstudiantes", estudiantesDistribucion.Count.ToString());
                            contador++;
                            reportParameter[contador] = new ReportParameter("estudiantesAcreditados", contadorAcreditado.ToString());
                            contador++;
                            reportParameter[contador] = new ReportParameter("estudianteNoAcreditados", contadorNoAcreditado.ToString());
                            contador++;
                            reportParameter[contador] = new ReportParameter("promedioAsistencia", Math.Round((decimal)(resulReporteGeneral.Sum(E => E.asistenciaAcumuladaPorcentaje) / resulReporteGeneral.Count), 2, MidpointRounding.AwayFromZero).ToString());
                            contador++;
                            reportParameter[contador] = new ReportParameter("maxAsistencia", resulReporteGeneral.Max(E => E.asistenciaAcumuladaPorcentaje).ToString());
                            contador++;
                            reportParameter[contador] = new ReportParameter("minAsistencia", resulReporteGeneral.Min(E => E.asistenciaAcumuladaPorcentaje).ToString());
                            contador++;
                            var carrera = new catalogoCarrera().obtenerTodasCarreras().Where(W => W.carrera == resultDistribucion.carrera).FirstOrDefault();
                            if (carrera != null)
                            {
                                var _coordinador = new catalogoUsuario().consultarCoordinador((int)resultDistribucion.semestre, carrera.idCarrera);
                                if (_coordinador != null)
                                {
                                    var resultCoordinador = new catalogoDocente().consultarDocenteXId(_coordinador.idDocente);
                                    if (resultCoordinador != null)
                                    {
                                        reportParameter[contador] = new ReportParameter("coordinador", resultCoordinador.nombre + " " + resultCoordinador.apellido1 + " " + resultCoordinador.apellido2);
                                        contador++;
                                    }
                                    else
                                    {
                                        reportParameter[contador] = new ReportParameter("coordinador", "");
                                        contador++;
                                    }
                                }
                                else
                                {
                                    reportParameter[contador] = new ReportParameter("coordinador", "");
                                    contador++;
                                }

                            }
                            else
                            {
                                reportParameter[contador] = new ReportParameter("coordinador", "");
                                contador++;
                            }
                            var resultHorario = new catalogoReporte().obtenerHorario(idPeriodoActual, codigoDistribucion);
                            iT = 1;
                            foreach (var item in resultHorario)
                            {
                                reportParameter[contador] = new ReportParameter("ent" + iT, item.horaInicio);
                                contador++;
                                reportParameter[contador] = new ReportParameter("sal" + iT, item.horaFin);
                                contador++;
                                reportParameter[contador] = new ReportParameter("hor" + iT, item.horaClase);
                                contador++;
                                iT++;
                            }

                            reportParameter[contador] = new ReportParameter("ReportLogo", ConvertImageToBase64(codigo, ImageFormat.Png)  );
                            contador++;
                            reportParameter[contador] = new ReportParameter("ReportLogoMIMEtype", "image/png");
                            contador++;
                            codigo.Dispose();
                            ReportViewer1.LocalReport.DataSources.Clear();
                            ReportDataSource dataSourceHorarario = new ReportDataSource();
                            ReportDataSource dataSourceAsistencia = new ReportDataSource();
                            ReportDataSource dataSourceResumenAsistencia = new ReportDataSource();
                            ReportDataSource dataSourceResumenEstudiantes = new ReportDataSource();



                            dataSourceAsistencia.Name = "dtsAsistenciaGeneral";
                            dataSourceAsistencia.Value = resulReporteGeneral;

                            dataSourceResumenEstudiantes.Name = "dtsResumenEstudiantes";
                            dataSourceResumenEstudiantes.Value = new catalogoReporte().obtenerResumenEstudiantes(contadorAcreditado, contadorNoAcreditado);

                            dataSourceResumenAsistencia.Name = "dtsResumenHoras";
                            dataSourceResumenAsistencia.Value = new catalogoReporte().obtenerResumenHora(totalHoraAcumuladas, ((totalSemanal * 16) - totalHoraAcumuladas));

                            ReportViewer1.LocalReport.DataSources.Add(dataSourceHorarario);
                            ReportViewer1.LocalReport.DataSources.Add(dataSourceAsistencia);
                            ReportViewer1.LocalReport.DataSources.Add(dataSourceResumenEstudiantes);
                            ReportViewer1.LocalReport.DataSources.Add(dataSourceResumenAsistencia);

                            ReportViewer1.LocalReport.ReportEmbeddedResource = "Presentacion.controlasistencia.reports.reporteGeneral.rdlc";
                            ReportViewer1.LocalReport.ReportPath = "controlasistencia/reports/reporteGeneral.rdlc";

                            ReportViewer1.LocalReport.SetParameters(reportParameter);
                            var parame = ReportViewer1.LocalReport.GetParameters();
                            ReportViewer1.Visible = true;
                            ReportViewer1.DataBind();
                            ReportViewer1.LocalReport.Refresh();

                            ddlPeriodo.ClearSelection();
                        }
                        else
                        {
                            ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "errorMessage('No existen datos para este reporte.');", true);
                            ReportViewer1.Visible = false;
                        }
                    }
                    else
                    {
                        ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "errorMessage('Seleccione los parametros de busqueda');", true);
                        ddlPeriodo.ClearSelection();
                        ReportViewer1.Visible = false;
                    }
                }
                else
                {
                    Server.Transfer("Default.aspx");
                }

            }
            catch (Exception)
            {

                ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "errorMessage('Error en el servidor intentelo de nuevo');", true);
                ReportViewer1.Visible = false;
            }
        }
        #endregion

        /// <summary>
        /// para convertir una imagen bitmap a base 64
        /// </summary>
        /// <param name="image"></param>
        /// <param name="format"></param>
        /// <returns></returns>
        private static string ConvertImageToBase64(Bitmap image, ImageFormat format)
        {
            byte[] imageArray;

            using (System.IO.MemoryStream imageStream = new System.IO.MemoryStream())
            {
                image.Save(imageStream, format);
                imageArray = new byte[imageStream.Length];
                imageStream.Seek(0, System.IO.SeekOrigin.Begin);
                imageStream.Read(imageArray, 0, int.Parse(imageStream.Length.ToString()));
            }

            return Convert.ToBase64String(imageArray);
        }
    }

}
